/*
 * @Description: 在线用户
 * @Author: DHL
 * @Date: 2022-03-14 16:51:47
 * @LastEditors: DHL
 * @LastEditTime: 2023-12-15 10:58:26
 */

import { defineComponent, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { assign, cloneDeep } from 'lodash-es'
import { TwTableOptions } from '@/types/table.d'

import { apiOnlineUserRemove, apiOnlineUserSearch } from '@/api/system/onlineUser'
import { OnlineUserModel, OnlineUserPageParams } from '@/api/system/model/onlineUserModel'
import { isEmpty } from '@/utils/isUtils'

export default defineComponent({
  name: 'ONLINEUSER',
  components: {},
  setup(props) {
    //////////////////////////////////////////////////
    // 属性
    //////////////////////////////////////////////////

    const loading = ref(false)
    const loadingByDel = ref(false)

    /**
     * 表格数据
     */
    const tableData = ref()

    /**
     * 查询表单
     */
    const searchFormRef = ref()

    /**
     * 数据列表
     */
    const tableRef = ref()

    /**
     * 表单
     */
    const formRef = ref()

    //////////////////////////////////////////////////
    // 查询表单
    //////////////////////////////////////////////////

    const defaultSearchForm = {
      loginName: '',
      name: ''
    }

    /**
     * 查询表单
     */
    const searchForm = reactive(cloneDeep(defaultSearchForm))

    //////////////////////////////////////////////////
    // 表格
    //////////////////////////////////////////////////

    /**
     * 表格配置
     */
    const tableOptions = reactive<TwTableOptions>({
      id: 'onlineuserTable',
      sortConfig: {
        defaultSort: [{ field: 'updateDate', order: 'desc' }]
      },
      columns: [
        { type: 'checkbox', title: '', align: 'center', width: 40 },
        { type: 'seq', title: '序号', width: 50 },
        { field: 'companyOrgName', title: '公司名称', sortable: false },
        { field: 'name', title: '姓名', sortable: false },
        { field: 'loginName', title: '账号', sortable: false },
        { field: 'orgName', title: '机构', sortable: false },
        { field: 'ip', title: 'IP', sortable: false },
        { field: 'loginTime', title: '登录时间', sortable: false },
        { title: '操作', width: 110, slots: { default: 'action' } }
      ]
    })

    /**
     * 绑定事件
     */
    const tableEvents = reactive({})

    //////////////////////////////////////////////////
    // 函数
    //////////////////////////////////////////////////

    /**
     * 查询表格数据函数
     * @param queryParams
     */
    function searchList(queryParams: OnlineUserPageParams) {
      loading.value = true
      apiOnlineUserSearch(assign(queryParams, searchForm))
        .then((result) => {
          tableData.value = result
        })
        .catch(() => {})
        .finally(() => {
          loading.value = false
        })
    }

    /**
     * 查询表格数据
     */
    function handleSearch() {
      tableRef.value.handleQuery()
    }

    /**
     * 刷新
     */
    function handleRefresh() {
      tableRef.value.handleReload()
    }

    /**
     * 重置
     */
    function handleReset() {
      assign(searchForm, cloneDeep(defaultSearchForm))
      tableRef.value.handleQuery()
    }

    /**
     * 批量删除
     */
    function handleDelete(row: OnlineUserModel) {
      let token = row.token || ''

      if (isEmpty(token)) {
        ElMessage.warning('请选择要删除的数据')
        return
      }

      ElMessageBox.confirm(`此操作将删除1条记录, 是否继续?`, '删除提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          loadingByDel.value = true
          apiOnlineUserRemove(token)
            .then((result) => {
              if (result?.success) {
                handleRefresh()

                ElMessage.success(result.message)
              } else {
                ElMessage.error(result?.message)
              }
            })
            .catch(() => {})
            .finally(() => {
              loadingByDel.value = false
            })
        })
        .catch(() => {
          ElMessage.info('删除被取消了')
        })
    }

    return {
      loading,
      loadingByDel,
      tableData,
      searchFormRef,
      tableRef,
      formRef,
      searchForm,
      tableOptions,
      tableEvents,
      searchList,
      handleSearch,
      handleRefresh,
      handleReset,
      handleDelete
    }
  }
})
